package org.aiesec.fortaleza.xmatch.model.entity;

import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.aiesec.fortaleza.xmatch.model.enumeration.Grau;
import org.aiesec.fortaleza.xmatch.model.enumeration.Status;
import org.aiesec.fortaleza.xmatch.model.enumeration.TipoIntercambio;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Pattern;

/**
 *	Representa uma vaga de intercambio disponivel. Cada TN diz respeito
 * 	a uma e somente uma vaga e a ela so pode ser associado um unico EP.
 * 	Uma TN esta alocada e sobre responsabilidade de um Comite Local e 
 * 	possui uma faixa de duracao, definido em meses. 
 */
@Entity(name="TN")
@Table(name="XMATCH_TN")
public class TN extends EntityBase{

	@NotNull
	@Column(name="TNID")
	@Pattern(regex="TN-[A-Za-z]{2}-[A-Za-z]{2}-[A-Za-z]{2}-[0-9]{4}-[0-9]{1,4}")
	private String tnid;
	
	@Column(name="DURACAO_MIN")
	private Integer duracao_min;
	
	@Column(name="DURACAO_MAX")
	private Integer duracao_max;
	
	@Enumerated
	@Column(name="GRAU")
	private Grau grau;
	
	@Enumerated
	@Column(name="TIPO_INTERCAMBIO")
	private TipoIntercambio tipoIntercambio;
	
	@NotNull
	@Enumerated
	@Column(name="STATUS")
	private Status status;
	
	@ManyToOne
	@JoinColumn(name="CL_ID")
	private CL cl;
	
	@OneToOne(mappedBy="tn")
	@JoinColumn(name="EP_ID")
	private EP ep;
	
	@ManyToMany
	@JoinTable(name="HABILIDADES_TN",
			joinColumns={@JoinColumn(name="TN_ID")},
			inverseJoinColumns={@JoinColumn(name="HABILIDADE_ID")})
	private List<Habilidade> habilidades;
	
	@ManyToMany
	@JoinTable(name="LIGUAS_TN",
			joinColumns={@JoinColumn(name="TN_ID")},
			inverseJoinColumns={@JoinColumn(name="LINGUA_ID")})
	private List<Lingua> linguas;
	
	public TN() {
		
	}

	public String getTnid() {
		return tnid;
	}

	public void setTnid(String tnid) {
		this.tnid = tnid;
	}

	public Integer getDuracao_min() {
		return duracao_min;
	}

	public void setDuracao_min(Integer duracao_min) {
		this.duracao_min = duracao_min;
	}

	public Integer getDuracao_max() {
		return duracao_max;
	}

	public void setDuracao_max(Integer duracao_max) {
		this.duracao_max = duracao_max;
	}

	public Grau getGrau() {
		return grau;
	}

	public void setGrau(Grau grau) {
		this.grau = grau;
	}

	public Status getStatus() {
		return status;
	}

	public void setStatus(Status status) {
		this.status = status;
	}
	
	public TipoIntercambio getTipoIntercambio() {
		return tipoIntercambio;
	}
	
	public void setTipoIntercambio(TipoIntercambio tipoIntercambio) {
		this.tipoIntercambio = tipoIntercambio;
	}
	
	public CL getCl() {
		return cl;
	}
	
	public void setCl(CL cl) {
		this.cl = cl;
	}
	
	public EP getEp() {
		return ep;
	}
	
	public void setEp(EP ep) {
		this.ep = ep;
	}
	
	public List<Habilidade> getHabilidades() {
		return habilidades;
	}
	
	public void setHabilidades(List<Habilidade> habilidades) {
		this.habilidades = habilidades;
	}
	
	public List<Lingua> getLinguas() {
		return linguas;
	}
	
	public void setLinguas(List<Lingua> linguas) {
		this.linguas = linguas;
	}
	
}
